#ifndef CODE_PID_H_
#define CODE_PID_H_

#include "stm32f10x.h"

// --- PID 的三个参数 ---
#define PID_KP                  (0.002f)   // PID的kp值
#define PID_KI                  (0.002f)     // PID的ki值
#define PID_KD                  (0.0f)      // PID的kd值

// PID 控制器结构体
typedef struct
{
    //三个PID参数
    float Kp;
    float Ki;
    float Kd;

    //目标值与实际值
    float target;
    float actual;

    //误差，上次调控误差，误差积分项
    float error;
    float last_error;
    float integral;

    //输出极限(最大与最小,最大得比最小大)
    float output_limit_max;
    float output_limit_min;

    //输出偏移
    float output_move;

} PID_Controller;


/**
 * @brief       初始化PID控制器
 * @param pid   传入PID控制器结构体指针
 * @param kp    Kp参数,float
 * @param ki    Ki参数,float
 * @param kd    Kd参数,float
 * @param max_limit 输出值的最大极限
 * @param min_limit 输出值的最小极限
 * @param period_ms 控制周期(毫秒)
 * @return int   0代表成功，1代表失败
 */
int PID_Init(PID_Controller* pid,
             float kp, float ki, float kd, 
             float max_limit, float min_limit, 
             int period_ms);


/**
 * @brief 计算并返回调控量(位置式PID)
 * @note  通过修改kp以达到输入电压输出duty
 * @param pid 传入PID控制器结构体指针
 * @param target 目标参量
 * @param actual 实际参量
 * @return float (Duty)
 */
float PID_Calculate(PID_Controller* pid, float target, float actual);

#endif /* CODE_PID_H_ */
